#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
@File    : /generator.py
@Time    : 2021-05-20 09:13:43
@Author  : Gray Snail
@Version : 1.0
@Contact : shtao2011@sina.com
@License : Copyright (c) 2021 Gray Snail
@Desc    : Python生成器
'''

'''
函数的定义中含有 yield 语句，函数的执行结果为 generator 对象
yield 会交出控制权，进入到等待状态
next、send 唤醒函数继续执行

获取生成器值的方法：
    for,next: 生成器是可迭代对象
    gen.send(param): 可以在获取下一个值时传递参数。生成器启动后第一个send必须传递None。

注意点：
1. 参数传递
    定义生成器的函数参数相当于初始值
    

2. 生成器函数中的返回值获取
    通过 StopIteration 异常捕获 return 值

'''


# 和列表生成式的区别
def gen1():
    a = list(range(10))
    print(a)
    b = [i + 1 for i in a]
    print(b)
    # c 为 generator 对象
    c = (i + 1 for i in a)
    print(c)


# 生成器传参
def generator_param(name):
    print(f'init: {name}')
    i = 0
    while i < name:
        parm = yield i
        print(f'parm:{parm}')
        i += 1

    return 'Done'


def test_generator_param():
    gen = generator_param(5)

    res = gen.send(None)
    print(res)
    try:
        for i in range(5):
            res = gen.send('haha')
            print(res)
    except StopIteration as e:
        print(e.value)


if __name__ == '__main__':
    test_generator_param()